package com.until;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

/**
 * @Author：YuanHaHa
 * @Date：2024/7/5 21:55
 */
public class HBUtils {
    // 配置文件对象
    private static Configuration conf = null;
    // HBase 连接对象
    private static Connection connection = null;
    // 用于管理HBase 表 .命名空间的对象
    private static HBaseAdmin admin = null;

    /**
     * 获取 HBase Configuration 对象
     *
     * @return
     */
    public static Configuration getHBaseConfiguration() {
        // 创建 HBase 配置文件对象
        conf = HBaseConfiguration.create();
        // 设置 Hbase 依赖的 Zookeeper ip 以及端口
        conf.set("hbase.zookeeper.quorum", "192.168.8.129,192.168.8.130,192.168.8.131");
        conf.set("hbase.zookeeper.property.clientPort", "2181");
        return conf;
    }

    /**
     * 获取 HBase 连接对象
     *
     * @return HBase 连接对象
     */
    public static Connection getConnection() {
        // 获取 HBase Configuration 对象
        conf = getHBaseConfiguration();
        try {
            // 获取 HBase 连接对象
            connection = ConnectionFactory.createConnection(conf);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return connection;
    }

    /**
     * 释放 Connection 和 HBaseAdmin 连接
     *
     * @param connection Connection 对象
     * @param admin      HBaseAdmin 对象
     */
    public static void release(Connection connection, Admin admin) {

        // 关闭 HBaseAdmin 对象
        if (admin != null) {
            try {
                admin.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        // 关闭 HBase 连接
        if (connection != null) {
            try {
                connection.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 将数据封装进 Put 对象中
     *
     * @param rowKey rowKey的值
     * @param cf     列族名
     * @param cn     列名
     * @param value  列名对应的参数
     * @return 封装后的 Put 对象
     */
    public static Put EncapsulationDataToPutObject(String rowKey, String cf, String cn, String value) {
        // 创建 Put 对象
        Put put = new Put(Bytes.toBytes(rowKey));
        // 添加数据
        put.addColumn(Bytes.toBytes(cf), Bytes.toBytes(cn), Bytes.toBytes(value));
        // 返回 put 对象
        return put;
    }
}
